#include <iostream>

// 模板：数据类型参数化
// 模板的好处：减少代码的重复编写
// template <typename T>
// T add(T a, T b)
// {
//     return a + b;
// }

struct Student
{
    std::string name;
    int money;
    void show()
    {
        std::cout<<name<<" "<<money<<std::endl;
    }
};


// 完全通用的代码是不存在的
template <typename T>
void Swap(T &a, T &b)
{
    T tmp = a;
    a = b;
    b = tmp;
}

// 模板函数的特化
// 特殊的类型有特殊的处理方式，写了特化版本，编译器不会再为其生成对应类型的模板函数
template <>
void Swap<Student>(Student &s1, Student &s2)
{
    std::cout << "特化的模板函数\n";
    int m = s1.money;
    s1.money = s2.money;
    s2.money = m;
}

int main()
{
    // 模板的显式调用
    // int c = add<int>(1, 2);
    // std::cout << c << std::endl;

    // std::cout << add(1.1, 2.2) << std::endl; // 隐式调用
    // // 当模板自动隐式调用不正确时，自行添加显式调用
    // std::cout << add<std::string>("hello", "world") << std::endl;

    Student s1={"zhangsan",100};
    Student s2={"lisi",500};

    Swap(s1,s2);

    s1.show();
    s2.show();
    return 0;
}